#※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
# File Name: message.sh
# Author: GID5564
# Description:
# Created Time: 05/07/24-15:43:36
#※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
#! /usr/bin/env bash

# 避免重复导入
#[[ -n $__XLIB_IMPORTED__MSG ]] && return 0
#__XLIB_IMPORTED__MSG=1


function __message_init__(){
    # __common_color__
    __font_color__
}

function __common_color__() {
    #弃用，终端常用颜色设置
    export SRED="tput setaf 1"
    export SGREEN="tput setaf 2"
    export SYELLOW="tput setaf 3"
    export SBLUE="tput setaf 4"
    export SMAGENTA="tput setaf 5"
    export SCYAN="tput setaf 6"
    export SBOLD="tput bold"
    
    export SRED_BG="tput setab 1"
    export SGREEN_BG="tput setab 2"
    export SYELLOW_BG="tput setab 3"
    export SBLUE_BG="tput setab 4"
    export SMAGENTA_BG="tput setab 5"
    export SCYAN_BG="tput setab 6"
    #重置
    export SRESET="tput sgr0"
}

#字体颜色
function __font_color__() {
    ## 定义常用颜色
	export RED=$(printf '\033[31m')
	export GREEN=$(printf '\033[32m')
	export YELLOW=$(printf '\033[33m')
	export BLUE=$(printf '\033[34m')
	export PURPLE=$(printf '\033[35m')
	export CYAN=$(printf '\033[36m')
	export BOLD=$(printf '\033[1m')
	export WHITE=$(printf '\033[37m')
    #重置
	export RESET=$(printf '\033[m')

	export RB_RED=$(printf '\033[38;5;196m')
	export RB_ORANGE=$(printf '\033[38;5;202m')
	export RB_YELLOW=$(printf '\033[38;5;226m')
	export RB_GREEN=$(printf '\033[38;5;082m')
	export RB_BLUE=$(printf '\033[38;5;021m')
	export RB_INDIGO=$(printf '\033[38;5;093m')
	export RB_VIOLET=$(printf '\033[38;5;163m')
	
	## 定义信息颜色
    #警报  #粗,闪烁;黄底红字
    export ALERT=$(printf '\033[1;5;31m;43m') 
    #错误信息  #粗,黑底红字
    export ERR=$(printf '\033[1;31m')
    #成功消息  #粗,黑底绿字
    export SUCCESS=$(printf '\033[1;32m')
    #警告信息  #粗,斜体,棕字
    export WARN=$(printf '\033[1;3;33m') 
    #提示信息  #粗,斜体,棕字
    export TIP=$(printf '\033[1;34m') 
    #调试信息  #粗，篮字
    export DEBUG=$(printf '\033[1;3;35m')
    #链接信息  #粗，下划线，青字
    export LINK=$(printf '\033[1;4;36m') 
    #普遍文本  #粗，白字
    export TEXT=$(printf '\033[1;37m') 


    #中括号
    export BRACKET_L=$(printf '\033[38;5;226m【 \033[m')
    export BRACKET_R=$(printf '\033[38;5;226m 】\033[m')
}

#严重警告
function alert(){
    printf "%s\n" "${BRACKET_L}${ALERT}‼️${RESET}${BRACKET_R}: ${ALERT}$@${RESET}"
}
#错误
function error(){
    printf "%s\n" "${BRACKET_L}${ERR}✘${RESET}${BRACKET_R}: ${ERR}$@${RESET}"
}
#成功
function success(){
    printf "%s\n" "${BRACKET_L}${SUCCESS}️✔${RESET}${BRACKET_R}: ${SUCCESS}$@${RESET}"
}
#预警
function warn(){
    printf "%s\n" "${BRACKET_L}${YELLOW}⚠${RESET}${BRACKET_R}: ${YELLOW}$@${RESET}"
}

#提示
function tip(){
    printf "%s\n" "${BRACKET_L}${TIP}💡${RESET}${BRACKET_R}: ${TIP}$@${RESET}"
}


#信息📢 
#换行
function msg(){
    printf "%s\n" "$@"
}
#不换行
function Msg(){
    printf "%s" "$@"
}
function pln() {
    printf "%s\n" "$@"
}
function panic() {
    pln "$@" >/dev/stderr
    exit 1
}


#内容展示
# prf "[序号]" "功能描述" "[简化]命令"
function prf(){
    [[ $# -gt 2 ]] && {
        printf "    %s %s: %s\n" "${CYAN}[${RESET}${RED}${1}${RESET}" "${GREEN}${2}${RESET}${CYAN}]${RESRT}" "${YELLOW}${3}${RESET}"
    } || {
        printf "    %s: %s\n" "${CYAN}[${RESET}${GREEN}$1${RESET}${CYAN}]${RESRT}" "${YELLOW}$2${RESET}"
    }
}


# die $? [message]
# 检查$?，有错则打印错误信息并exit code
function die() {
    local msg=${2}
    local code=${1:-1} 
    [[ $code -gt 0 ]] && {
        [[ -n $msg ]] && error "$msg"
        exit $code
    }
    return $GENERIC_NORMAL
}

#接收python返回状态
function msg_return(){
    [[ $1 -eq 0 || $1 = "True" ]] && display_status "success" || display_status "failed"
}


#请按回车键继续
function press(){
    msg "${BLUE}按${RESET}${GREEN}回车键${RESET}${BLUE}继续${RESET}"
	read
}


########################################
# 描述: 在终端上显示信息并记录日志
# 参数: $1:要显示的消息，$2:文本颜色
# 返回: 
# 实例: display <msg> <color>
########################################
function display() {
    local MESSAGE="$1"
    local COLOR="${2:-$WHITE}"

    if has_value "MESSAGE"; then
        echo "${COLOR}$MESSAGE${RESET}"
        if ! option_enabled "DONOTLOG"; then
            log "$MESSAGE"
        fi
    else
        echo "-- no message received --"
        if ! option_enabled "DONOTLOG"; then
            log "$MESSAGE"

        fi
    fi
}


########################################
# 描述: 在行尾显示一条消息及其状态
# 参数: $1:要显示的消息，$2:消息状态
# 返回: 
# 实例: msg_status <msg> <status>
########################################
function msg_status() {
    local MESSAGE="$1"
    local STATUS="$2"

    export DONOTLOG="yes"
    log_status "$MESSAGE" "$STATUS"
    display "$MESSAGE"
    display_status "$STATUS"
    export DONOTLOG="no"
}

########################################
# 描述: 显示一条状态为“紧急”的消息
# 参数: $1:要显示的消息
# 实例: msg_emergency <msg> 
########################################
msg_emergency() {
    local MESSAGE="$1"
    local STATUS="EMERGENCY"
    msg_status "$MESSAGE" "$STATUS"
}

########################################
# 描述: 显示一条状态为“警报”的消息
# 参数: $1:要显示的消息
# 实例: msg_alert <msg> 
########################################
msg_alert() {
    local MESSAGE="$1"
    local STATUS="ALERT"
    msg_status "$MESSAGE" "$STATUS"
}
########################################
# 描述: 显示一条状态为“关键”的消息
# 参数: $1:要显示的消息
# 实例: msg_critical <msg> 
########################################
msg_critical() {
    local MESSAGE="$1"
    local STATUS="CRITICAL"
    msg_status "$MESSAGE" "$STATUS"
}
########################################
# 描述: 显示一条状态为“错误”的消息
# 参数: $1:要显示的消息
# 实例: msg_error <msg> 
########################################
msg_error() {
    local MESSAGE="$1"
    local STATUS="ERROR"
    msg_status "$MESSAGE" "$STATUS"
}
########################################
# 描述: 显示一条状态为“警告”的消息
# 参数: $1:要显示的消息
# 实例: msg_warning <msg> 
########################################
msg_warning() {
    local MESSAGE="$1"
    local STATUS="WARNING"
    msg_status "$MESSAGE" "$STATUS"
}

########################################
# 描述: 显示一条状态为“通知”的消息
# 参数: $1:要显示的消息
# 实例: msg_notice <msg> 
########################################
msg_notice() {
    local MESSAGE="$1"
    local STATUS="NOTICE"
    msg_status "$MESSAGE" "$STATUS"
}
########################################
# 描述: 显示一条状态为“信息”的消息
# 参数: $1:要显示的消息
# 实例: msg_info <msg> 
########################################
msg_info() {
    local MESSAGE="$1"
    local STATUS="INFO"
    msg_status "$MESSAGE" "$STATUS"
}
########################################
# 描述: 显示一条状态为“调试”的消息
# 参数: $1:要显示的消息
# 实例: msg_debug <msg> 
########################################
msg_debug() {
    local MESSAGE="$1"
    local STATUS="DEBUG"
    msg_status "$MESSAGE" "$STATUS"
}
########################################
# 描述: 显示一条状态为“正常”的消息
# 参数: $1:要显示的消息
# 实例: msg_ok <msg> 
########################################
msg_ok() {
    local MESSAGE="$1"
    local STATUS="NORMAL"
    msg_status "$MESSAGE" "$STATUS"
}
########################################
# 描述: 显示一条状态为“异常”的消息
# 参数: $1:要显示的消息
# 实例: msg_not_ok <msg> 
########################################
msg_not_ok() {
    local MESSAGE="$1"
    local STATUS="ABNORMAL"
    msg_status "$MESSAGE" "$STATUS"
}
########################################
# 描述: 显示一条状态为“失败”的消息
# 参数: $1:要显示的消息
# 实例: msg_failed <msg> 
########################################
msg_failed() {
    local MESSAGE="$1"
    local STATUS="FAILED"
    msg_status "$MESSAGE" "$STATUS"
}

########################################
# 描述: 显示一条状态为“成功”的消息
# 参数: $1:要显示的消息
# 实例: msg_success <msg> 
########################################
msg_success() {
    local MESSAGE="$1"
    local STATUS="SUCCESS"
    msg_status "$MESSAGE" "$STATUS"
}
########################################
# 描述: 显示一条状态为“已通过”的消息
# 参数: $1:要显示的消息
# 实例: msg_passed <msg> 
########################################
msg_passed() {
    local MESSAGE="$1"
    local STATUS="PASSED"
    msg_status "$MESSAGE" "$STATUS"
}

########################################
# 描述: 光标移至上一行的行尾，并显示状态信息
# 参数: $1:要显示的消息，$2:文本颜色
# 实例: __raw_status <msg> <color>
########################################
function __raw_status() {
    local STATUS="$1"
    local COLOR="${2:-$WHITE}"

    __position_cursor
    echo -n "${PURPLE}[${RESET}"
    echo -n "${BOLD}${COLOR}$STATUS${RESET}${RESET}"
    echo "${PURPLE}]${RESET}"
}
########################################
# 描述: 光标移至上一行的行尾
# 参数: 
# 实例: __position_cursor 
########################################
function __position_cursor() {
    local RES_COL=$(( $(tput cols) - 12 ))
    tput cuf $RES_COL
    tput cuu1
}

########################################
# 描述: 在右侧显示指定的消息状态
# 参数: $1:要显示的消息状态
# 实例: display_status <status> 
########################################
function display_status() {
    local STATUS=$(upper $1)
    case $STATUS in
        EMERGENCY )
        #紧急的
            local STATUS="EMERGENCY"
            local COLOR="$RED"
            ;;
        ALERT )
            local STATUS="  ALERT  "
            local COLOR="$ALERT"
            ;;
        CRITICAL )
        #关键的
            local STATUS="CRITICAL "
            local COLOR="$RED"
            ;;
        ERROR )
            local STATUS="  ERROR  "
            local COLOR="$ERR"
            ;;
        WARNING )
            local STATUS=" WARNING "
            local COLOR="$WRN"
            ;;
        NOTICE )
            local STATUS=" NOTICE  "
            local COLOR="$TIP"
            ;;
        INFO )
            local STATUS="  INFO   "
            local COLOR="$TEXT"
            ;;
        DEBUG )
            local STATUS="  DEBUG  "
            local COLOR="$DEBUG"
            ;;
        OK  )
            local STATUS=" NORMAL "
            local COLOR="$GREEN"
            ;;
        NOT_OK)
            local STATUS="ABNORMAL"
            local COLOR="$RED"
            ;;
        PASSED )
            local STATUS=" PASSED  "
            local COLOR="$GREEN"
            ;;
        SUCCESS )
            local STATUS=" SUCCESS "
            local COLOR="$SUCCESS"
            ;;
        FAILURE | FAILED )
            local STATUS=" FAILED  "
            local COLOR="$RED"
            ;;
        *)
            local STATUS="UNDEFINED"
            local COLOR="$YELLOW"
    esac

    __raw_status "$STATUS" "$COLOR"
}






















__message_init__


